在開發或導入新的模組時,我們經常需要快速進行一些測試,或者直接從資料庫中撈取資料來進行除錯。但回想我們在 從網路設計到 Docker Compose:搭建 Odoo 反向代理的第一步 中設計的網路架構,為了安全性,我們的資料庫並沒有將埠口暴露(expose)到主機 (host),那麼我們該如何直接查看資料庫的內容呢?
最簡單的方法就是直接加入一個資料庫管理工具的容器——pgAdmin。
pgAdmin 是一個功能強大的開源 PostgreSQL 資料庫管理工具,提供圖形化的使用者介面,讓開發者和資料庫管理員可以輕鬆地管理和監控 PostgreSQL 資料庫。透過 pgAdmin,我們可以:
由於在開發時也經常需要使用,我們先在 odooBundle-Codebase 這層的 Docker Compose 中嘗試加入 pgAdmin。方法非常簡單,直接使用官方的映像檔,並將它的網頁介面暴露出來即可。
Docker Compose 的容器設定:
postgresql-admin:
image: dpage/pgadmin4:8.10
restart: always
networks:
- odoo-net
ports:
- "8080:80" # 將 pgAdmin 的 HTTP 服務埠口暴露出來
environment:
- PGADMIN_DEFAULT_EMAIL=odoo-db@example.com # 直接透過環境變數來設定網頁介面的帳號和密碼。
- PGADMIN_DEFAULT_PASSWORD=AY0kNIHYqeqFg64c
volumes:
- db-admin-data:/var/lib/pgadmin # 如果不設定這個,每次重啟都要重新設定連線資訊
參考連結:pgAdmin - Container Deployment
接下來,直接啟動 Docker 容器,然後在瀏覽器中輸入 http://localhost:8080/
就可以進入 pgAdmin 的介面。登入後,新增我們的資料庫容器的連線資訊,就能成功連線進去了。
主機名稱:填寫在 Docker Compose 中定義的資料庫容器名稱。
在我們的部署環境 WebApp-Deployment 中,開發者可能也需要使用 pgAdmin,例如在測試升級模組時,可能會遇到舊資料與新模組不相容的情況。因此,部署層的 Docker Compose 也需要加入 pgAdmin 容器。
不過,由於 pgAdmin 自帶的網頁介面並沒有加密,我們不能冒著帳號密碼被明文攔截的風險。因此,需要像 Odoo 的網頁一樣,透過反向代理(reverse proxy)將流量加密。
Docker Compose 的容器設定:
postgresql-admin:
image: dpage/pgadmin4:8.10
restart: always
networks:
- prod-net
- dev-net
env_file:
- ./config/pgadmin.env # 將環境變數也放入我們的 config 資料夾
volumes:
- ./postgresql-admin/servers.json:/pgadmin4/servers.json
- db-admin-data:/var/lib/pgadmin
我們在 volumes 中還加入了 servers.json
檔案,用來預先帶入一些資料庫連線的資訊,讓我們不用進入 pgAdmin 後還要手動設定。
servers.json
的內容:
{
"Servers": {
"1": {
"Name": "Odoo Production PostgreSQL",
"Group": "Servers",
"Host": "postgresql-prod",
"Port": 5432,
"MaintenanceDB": "postgres",
"Username": "odoo_user",
"SSLMode": "prefer",
"PassFile": "/pgpass"
},
"2": {
"Name": "Odoo Development PostgreSQL",
"Group": "Servers",
"Host": "postgresql-dev",
"Port": 5432,
"MaintenanceDB": "postgres",
"Username": "odoo_user",
"SSLMode": "prefer",
"PassFile": "/pgpass"
}
}
}
在反向代理(Nginx)的設定方面,基本上與 為 Odoo 建立 Nginx 反向代理第二步:nginx.conf 設定實作 中的設定相同,我們就不再贅述。只需要為 pgAdmin 再新增一個 server
區塊,例如:
server {
listen 443 ssl;
server_name odoo-db.internal.example.com odoo-db.internal.example.local;
# 其他設定...
}
另外,在生成 SSL 憑證時,可以為 pgAdmin 的域名加入憑證的別名,這樣就可以共用同一個憑證檔案,不需要為每個域名都生成一個憑證。可以參考之前的文章odoo 反向代理設定第四步:自簽 Root CA 並安裝 SSL 憑證來了解如何生成憑證。
openssl.cnf
中的設定:
[ req ]
...
[ req_distinguished_name ]
...
[ v3_req ]
...
[ alt_names ]
DNS.1 = odoo.internal.example.local
DNS.2 = odoo-db.internal.example.com
DNS.3 = odoo-db.internal.example.local
這樣一來,我們就在整合層和部署層都加入了實用的資料庫管理工具。
(但現在是真的不知道明天要寫什麼了XXXD)